﻿/*
题目: 买卖股票的最佳时机含冷冻期
 
给定一个整数数组prices，其中第  prices[i] 表示第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:

卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。
注意：你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/
*/

#include <iostream>
#include <random>
#include <string>
#include <vector>
#include <list>
#include "TreeNode.hpp"
#include "ListNode.hpp"
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <functional>

using namespace std;

class Solution {
public:
    // 分别表示 卖出去 占有 冷却
#define SELL  0         
#define HAS   1
#define COLD  2

// 卖出股票之后冷却一天
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(3, vector<int>(prices.size(), 0));

        dp[HAS][0] = -prices[0];

        for (int i = 1; i < prices.size(); i++) {
            dp[SELL][i] = dp[HAS][i - 1] + prices[i];                            // 选择出售
            dp[HAS][i] = max(dp[HAS][i - 1], dp[COLD][i - 1] - prices[i]);      // 选择买入
            dp[COLD][i] = max(dp[SELL][i - 1], dp[COLD][i - 1]);                 // 选择进入冷却，或者继续冷却
        }

        return max(dp[SELL][prices.size() - 1], dp[COLD][prices.size() - 1]);
    }
};